// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.

package com.netease.yunxin.kit.chatkit.ui.view.emoji;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;
import java.lang.ref.WeakReference;

public class ImageSpanAlignCenter extends ImageSpan {

  private static final char[] ELLIPSIS_NORMAL = {'\u2026'};
  private static final char[] ELLIPSIS_TWO_DOTS = {'\u2025'};

  public ImageSpanAlignCenter(Context context, int resourceId) {
    super(context, resourceId);
  }

  public ImageSpanAlignCenter(Drawable d) {
    super(d);
  }

  @Override
  public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
    Drawable d = getCachedDrawable(paint);
    Rect rect = d.getBounds();

    if (fm != null) {
      Paint.FontMetricsInt fontMetrics = new Paint.FontMetricsInt();
      paint.getFontMetricsInt(fontMetrics);

      fm.ascent = fontMetrics.ascent;
      fm.descent = fontMetrics.descent;

      fm.top = fontMetrics.top;
      fm.bottom = fontMetrics.bottom;
    }
    return rect.right;
  }

  @Override
  public void draw(
      Canvas canvas,
      CharSequence text,
      int start,
      int end,
      float x,
      int top,
      int y,
      int bottom,
      Paint paint) {
    final String s = text.toString();
    String subS = s.substring(start, end);
    if (ELLIPSIS_NORMAL[0] == subS.charAt(0) || ELLIPSIS_TWO_DOTS[0] == subS.charAt(0)) {
      canvas.save();
      canvas.drawText(subS, x, y, paint);
    } else {
      Drawable d = getCachedDrawable(paint);
      canvas.save();
      int transY;
      Paint.FontMetricsInt fontMetrics = new Paint.FontMetricsInt();
      paint.getFontMetricsInt(fontMetrics);
      transY = y + fontMetrics.ascent;
      canvas.translate(x, transY);
      d.draw(canvas);
    }
    canvas.restore();
  }

  private Drawable getCachedDrawable(Paint paint) {
    WeakReference<Drawable> wr = mDrawableRef;
    Drawable d = null;

    if (wr != null) d = wr.get();

    if (d == null) {
      d = getDrawable();
      d.setBounds(new Rect(0, 0, paint.getFontMetricsInt(null), paint.getFontMetricsInt(null)));
      mDrawableRef = new WeakReference<Drawable>(d);
    }

    return d;
  }

  private WeakReference<Drawable> mDrawableRef;
}
